home *** CD-ROM | disk | FTP | other *** search
- /*Shapiro-Wilk and Shapiro-Francia Tests for Normality*/
-
- /* Original Subroutines By:Paul Johnson
- 1420 Lake Blvd #29
- Davis,California 95616
- EZ006244@ALCOR.UCDAVIS.EDU
-
- These subroutines can be freely used for non-commercial purposes and can
- be freely distributed. Copyright 1994, Paul Johnson
-
- Changes and additions copyright 1999, Rudy Kohut
- */
-
- options results
- if ~show('P','TCALC') then do
- address command 'run turbocalc:turbocalc'
- address command 'waitforport TCALC'
- loadflag=1
- end
- address 'TCALC'
- 'DEFPUBSCREEN()'
- /* Add-in Rexx Math Library needed for some routines */
- signal on syntax
- if ~show('l','rexxmathlib.library') then
- call addlib('rexxmathlib.library',0,-30)
- if ~show('l','rexxreqtools.library') then
- call addlib('rexxreqtools.library',0,-30)
- if ~show('l','rexxsupport.library') then
- call addlib('rexxsupport.library',0,-30)
- /* add to library list */
- signal off syntax
-
- /* Start Main Routine */
- if loadflag=1 then 'Load()'
- 'ActivateWindow()'
-
- range=rtgetstring(,"Enter Cell Range for Input","Input Request") /*,,'rt_pubscrname="TCALC"')*/
- colon=pos(":",range)
- if colon=0 then do
- 'Message "Please select a range before executing this script"'
- 'DEFPUBSCREEN("Workbench")'
- exit
- end
-
- /* Find cell references and cell, column numbers */
- start_cell=substr(range,1,colon-1)
- end_cell=substr(range,colon+1)
- start_row=cellrow(start_cell)
- end_row=cellrow(end_cell)
- start_col=cellcol(start_cell)
- end_col=cellcol(end_cell)
- NRows=end_row-start_row+1
- NCols=end_col-start_col+1
- if (NCols >1) then do
- 'Message "Only One Column of Data Allowed"'
- 'DEFPUBSCREEN("Workbench")'
- exit
- end
-
-
- /* Get cell reference for output range */
- out_cell=rtgetstring(,"Enter Cell Reference for Output","Input Request") /*,,'rt_pubscrname="TCALC"')*/
- if out_cell="" then do
- 'DEFPUBSCREEN("Workbench")'
- exit
- end
- if length(out_cell)<2 | datatype(left(out_cell,1),'n') then do
- 'Message "Invalid cell reference"'
- 'DEFPUBSCREEN("Workbench")'
- exit
- end
- /* Suppress Screen Redraw to Speed Things Up */
- 'Refresh 0'
-
- /* Open a small output window on tcalc screen*/
- fo=0
- CR='0a'x
- DisplayMsg="Calculating...Please Wait."||CR||"User input is disabled during calculation."||CR
- if open(6Info, 'con:100/0/450/80/Progress/SCREEN TCALC', w) then do
- call writeln(6Info, DisplayMsg)
- fo=1
- end
- else do
- 'Message "TCALC Screen not available for Progress messages"'
- end
- CALL DELAY(150)
-
- /* Get cell references for top cell in each column */
- 'SelectCell' start_cell
- do col=start_col to end_col
- 'GetCursorPos'
- top_cell.col=result
- 'Column 1'
- end
-
- /* Get labels for later use on output */
- title.=""
- 'SelectCell' start_cell
- 'GetValue'
- testlabel=result
- testlabel=strip(testlabel)
- if datatype(testlabel,'n')=1 then do
- labelflag=0
- do x=1 to NCols
- title.x="Column "||x
- end
- end
- else do
- labelflag=1
- NRows=NRows-1
- do x=1 to NCols
- 'GetValue'
- str=result
- title.x=translate(strip(str),"_"," ")
- 'Column 1'
- end
- end
-
- /* Get data from cell range */
- col=start_col
- lav=0
- tot=0
- count.=0
- total.=0
- X.=0
- 'SelectCell' top_cell.col
- if labelflag=1 then 'CursorDown 1'
- do y=1 to NRows
- 'GetValue'
- valtest=result
- if datatype(valtest)='NUM' then do
- 'GetValue'
- val=result
- X.y=val
- tot=tot+val
- total.x=tot
- count.x=1+count.x
- end
- 'CursorDown 1'
- end
- if fo then call writech(6Info,"Progress...10 ")
-
- /* Which test to use? */
- string=""
- Select
- When NRows<51 then DO
- 'Message "N < 51 - Doing Shapiro-Wilk Test"'
- call TEST1(NRows)
- End
- When NRows>50 then DO
- 'Message "N > 50 - Doing Shapiro-Francis Test"'
- call TEST2(NRows)
- End
- Otherwise nop
- end
- if fo then do
- call writeln(6Info,"100")
- call writeln(6Info,"Writing output to window...")
- end
-
- /* Output */
- 'SelectCell' out_cell
- 'ColumnWidth 15'
- str=translate(strip(string),"_"," ")
- 'Put' str
- 'CursorDown 1'
- 'Alignment 2'
- 'Put "W:"'
- 'CursorRight 1'
- 'Alignment 1'
- 'Put' format(Y.1,,5)
- 'CursorDown 1'
- 'Alignment 1'
- 'Put' format(G,,5)
- 'CursorLeft 1'
- 'Alignment 2'
- 'Put "G:"'
- 'CursorDown 1'
- 'Alignment 2'
- 'Put "p-value:"'
- 'CursorRight 1'
- 'Alignment 1'
- 'Put' format(P,,4)
- 'Refresh 1'
- 'Refresh 2'
- /*'Message' "Finished"*/
- /*indicate the main script is finished*/
- DisplayMsg="Cleaning up ...."||CR||"Exiting"
- result=writeln(6Info, DisplayMsg)
- if result~=0 then do
- /*Wait 3 seconds*/
- CALL DELAY(150)
- /* close window*/
- result=close(6Info)
- end
- 'DEFPUBSCREEN("Workbench")'
- exit
-
-
- /* Shapiro-Wilk W Test of Normality for Small Samples */
- TEST1: Procedure Expose fo G P string X. Y.
- parse arg N
- string="Shapiro-Wilk W Test of Normality for Small Samples"
- X1.=0
- Y.=0
- A.=0
- B.=0
- C.=0
- D.=0
- G=0
- SUMB=0
- SUMX=0
- SUMX2=0
- K=N/2
- IF (N > 50) then do
- 'Message "Sample size limited to 50"'
- exit
- end
- IF N<7 then DO
- 'Message "Sample size is small - check results!"'
- END
- DO I =1 to N
- SUMX=SUMX+X.I
- SUMX2=SUMX2+(X.I)**2
- X1.I=X.I
- End
- if fo then call writech(6Info,"20 ")
- S2=SUMX2-SUMX**2/N
- CALL SORTX(N)
- if fo then call writech(6Info,"40 ")
- IF N>39 then
- SELECT
- WHEN N=50 THEN DO
- A.1 = 0.3751
- A.2 = 0.2574
- A.3 = 0.2260
- A.4 = 0.2032
- A.5 = 0.1847
- A.6 = 0.1691
- A.7 = 0.1554
- A.8 = 0.1430
- A.9 = 0.1317
- A.10 = 0.1212
- A.11 = 0.1113
- A.12 = 0.1020
- A.13 = 0.0932
- A.14 = 0.0846
- A.15 = 0.0764
- A.16 = 0.0685
- A.17 = 0.0608
- A.18 = 0.0532
- A.19 = 0.0459
- A.20 = 0.0386
- A.21 = 0.0314
- A.22 = 0.0244
- A.23 = 0.0174
- A.24 = 0.0104
- A.25 = 0.0035
- B.50=-7.677
- C.50=2.212
- D.50=.1436
- END
- WHEN N=49 THEN DO
- A.1 = 0.3770
- A.2 = 0.2589
- A.3 = 0.2271
- A.4 = 0.2038
- A.5 = 0.1851
- A.6 = 0.1692
- A.7 = 0.1553
- A.8 = 0.1427
- A.9 = 0.1312
- A.10 = 0.1205
- A.11 = 0.1105
- A.12 = 0.1010
- A.13 = 0.0919
- A.14 = 0.0832
- A.15 = 0.0748
- A.16 = 0.0667
- A.17 = 0.0588
- A.18 = 0.0511
- A.19 = 0.0436
- A.20 = 0.0361
- A.21 = 0.0288
- A.22 = 0.0215
- A.23 = 0.0143
- A.24 = 0.0071
- B.49=-7.615
- C.49=2.198
- D.49=.1451
- END
- WHEN N=48 THEN DO
- A.1 = 0.3789
- A.2 = 0.2604
- A.3 = 0.2281
- A.4 = 0.2045
- A.5 = 0.1855
- A.6 = 0.1693
- A.7 = 0.1551
- A.8 = 0.1423
- A.9 = 0.1306
- A.10 = 0.1197
- A.11 = 0.1095
- A.12 = 0.0998
- A.13 = 0.0906
- A.14 = 0.0817
- A.15 = 0.0731
- A.16 = 0.0648
- A.17 = 0.0568
- A.18 = 0.0489
- A.19 = 0.0411
- A.20 = 0.0335
- A.21 = 0.0259
- A.22 = 0.0185
- A.23 = 0.0111
- A.24 = 0.0037
- B.48=-7.555
- C.48=2.183
- D.48=.1466
- END
- WHEN N=47 THEN DO
- A.1 = 0.3808
- A.2 = 0.2620
- A.3 = 0.2291
- A.4 = 0.2052
- A.5 = 0.1859
- A.6 = 0.1695
- A.7 = 0.1550
- A.8 = 0.1420
- A.9 = 0.1300
- A.10 = 0.1189
- A.11 = 0.1085
- A.12 = 0.0986
- A.13 = 0.0892
- A.14 = 0.0801
- A.15 = 0.0713
- A.16 = 0.0628
- A.17 = 0.0546
- A.18 = 0.0465
- A.19 = 0.0385
- A.20 = 0.0307
- A.21 = 0.0229
- A.22 = 0.0153
- A.23 = 0.0076
- B.47=-7.484
- C.47=2.169
- D.47=.1482
- END
- WHEN N=46 THEN DO
- A.1 = 0.3830
- A.2 = 0.2635
- A.3 = 0.2302
- A.4 = 0.2058
- A.5 = 0.1862
- A.6 = 0.1695
- A.7 = 0.1548
- A.8 = 0.1415
- A.9 = 0.1293
- A.10 = 0.1180
- A.11 = 0.1073
- A.12 = 0.0972
- A.13 = 0.0876
- A.14 = 0.0783
- A.15 = 0.0694
- A.16 = 0.0607
- A.17 = 0.0522
- A.18 = 0.0439
- A.19 = 0.0357
- A.20 = 0.0277
- A.21 = 0.0197
- A.22 = 0.0118
- A.23 = 0.0039
- B.46=-7.414
- C.46=2.155
- D.46=.1499
- END
- WHEN N=45 THEN DO
- A.1 = 0.3850
- A.2 = 0.2651
- A.3 = 0.2313
- A.4 = 0.2065
- A.5 = 0.1865
- A.6 = 0.1695
- A.7 = 0.1545
- A.8 = 0.1410
- A.9 = 0.1286
- A.10 = 0.1170
- A.11 = 0.1062
- A.12 = 0.0959
- A.13 = 0.0860
- A.14 = 0.0765
- A.15 = 0.0673
- A.16 = 0.0584
- A.17 = 0.0497
- A.18 = 0.0412
- A.19 = 0.0328
- A.20 = 0.0245
- A.21 = 0.0163
- A.22 = 0.0081
- B.45=-7.345
- C.45=2.141
- D.45=.1516
- END
- WHEN N=44 THEN DO
- A.1 = 0.3872
- A.2 = 0.2667
- A.3 = 0.2323
- A.4 = 0.2072
- A.5 = 0.1868
- A.6 = 0.1695
- A.7 = 0.1542
- A.8 = 0.1405
- A.9 = 0.1278
- A.10 = 0.1160
- A.11 = 0.1049
- A.12 = 0.0943
- A.13 = 0.0842
- A.14 = 0.0745
- A.15 = 0.0651
- A.16 = 0.0560
- A.17 = 0.0471
- A.18 = 0.0383
- A.19 = 0.0296
- A.20 = 0.0211
- A.21 = 0.0126
- A.22 = 0.0042
- B.44=-7.266
- C.44=2.128
- D.44=.1534
- END
- WHEN N=43 THEN DO
- A.1 = 0.3894
- A.2 = 0.2684
- A.3 = 0.2334
- A.4 = 0.2078
- A.5 = 0.1871
- A.6 = 0.1695
- A.7 = 0.1539
- A.8 = 0.1398
- A.9 = 0.1269
- A.10 = 0.1149
- A.11 = 0.1035
- A.12 = 0.0927
- A.13 = 0.0824
- A.14 = 0.0724
- A.15 = 0.0628
- A.16 = 0.0534
- A.17 = 0.0442
- A.18 = 0.0352
- A.19 = 0.0263
- A.20 = 0.0175
- A.21 = 0.0087
- B.43=-7.188
- C.43=2.114
- D.43=.1552
- END
- WHEN N=42 THEN DO
- A.1 = 0.3917
- A.2 = 0.2701
- A.3 = 0.2345
- A.4 = 0.2085
- A.5 = 0.1874
- A.6 = 0.1694
- A.7 = 0.1535
- A.8 = 0.1392
- A.9 = 0.1259
- A.10 = 0.1136
- A.11 = 0.1020
- A.12 = 0.0909
- A.13 = 0.0804
- A.14 = 0.0701
- A.15 = 0.0602
- A.16 = 0.0506
- A.17 = 0.0411
- A.18 = 0.0318
- A.19 = 0.0227
- A.20 = 0.0136
- A.21 = 0.0045
- B.42=-7.111
- C.42=2.101
- D.42=.1572
- END
- WHEN N=41 THEN DO
- A.1 = 0.3940
- A.2 = 0.2719
- A.3 = 0.2357
- A.4 = 0.2091
- A.5 = 0.1876
- A.6 = 0.1693
- A.7 = 0.1531
- A.8 = 0.1384
- A.9 = 0.1249
- A.10 = 0.1123
- A.11 = 0.1004
- A.12 = 0.0891
- A.13 = 0.0782
- A.14 = 0.0677
- A.15 = 0.0575
- A.16 = 0.0476
- A.17 = 0.0379
- A.18 = 0.0283
- A.19 = 0.0188
- A.20 = 0.0094
- B.41=-7.035
- C.41=2.088
- D.41=.1591
- END
- WHEN N=40 THEN DO
- A.1 = 0.3964
- A.2 = 0.2737
- A.3 = 0.2368
- A.4 = 0.2098
- A.5 = 0.1878
- A.6 = 0.1691
- A.7 = 0.1526
- A.8 = 0.1376
- A.9 = 0.1237
- A.10 = 0.1108
- A.11 = 0.0986
- A.12 = 0.0870
- A.13 = 0.0759
- A.14 = 0.0651
- A.15 = 0.0546
- A.16 = 0.0444
- A.17 = 0.0343
- A.18 = 0.0244
- A.19 = 0.0146
- A.20 = 0.0049
- B.40=-6.961
- C.40=2.075
- D.40=.1612
- END
- OTHERWISE NOP
- END
- IF N>29 & N<40 then
- SELECT
- WHEN N=39 THEN DO
- A.1 = 0.3989
- A.2 = 0.2755
- A.3 = 0.2380
- A.4 = 0.2104
- A.5 = 0.1880
- A.6 = 0.1689
- A.7 = 0.1520
- A.8 = 0.1366
- A.9 = 0.1225
- A.10 = 0.1092
- A.11 = 0.0967
- A.12 = 0.0848
- A.13 = 0.0733
- A.14 = 0.0622
- A.15 = 0.0515
- A.16 = 0.0409
- A.17 = 0.0305
- A.18 = 0.0203
- A.19 = 0.0101
- B.39=-6.887
- C.39=2.062
- D.39=.1633
- END
- WHEN N=38 THEN DO
- A.1 = 0.4015
- A.2 = 0.2774
- A.3 = 0.2391
- A.4 = 0.2110
- A.5 = 0.1881
- A.6 = 0.1686
- A.7 = 0.1513
- A.8 = 0.1356
- A.9 = 0.1211
- A.10 = 0.1075
- A.11 = 0.0947
- A.12 = 0.0824
- A.13 = 0.0706
- A.14 = 0.0592
- A.15 = 0.0481
- A.16 = 0.0372
- A.17 = 0.0264
- A.18 = 0.0158
- A.19 = 0.0053
- B.38=-6.803
- C.38=2.049
- D.38=.1656
- END
- WHEN N=37 THEN DO
- A.1 = 0.4040
- A.2 = 0.2794
- A.3 = 0.2403
- A.4 = 0.2116
- A.5 = 0.1883
- A.6 = 0.1683
- A.7 = 0.1505
- A.8 = 0.1344
- A.9 = 0.1196
- A.10 = 0.1056
- A.11 = 0.0924
- A.12 = 0.0798
- A.13 = 0.0677
- A.14 = 0.0559
- A.15 = 0.0444
- A.16 = 0.0331
- A.17 = 0.0220
- A.18 = 0.0110
- B.37=-6.721
- C.37=2.037
- D.37=.1677
- END
- WHEN N=36 THEN DO
- A.1 = 0.4068
- A.2 = 0.2813
- A.3 = 0.2415
- A.4 = 0.2121
- A.5 = 0.1883
- A.6 = 0.1678
- A.7 = 0.1496
- A.8 = 0.1331
- A.9 = 0.1179
- A.10 = 0.1036
- A.11 = 0.0900
- A.12 = 0.0770
- A.13 = 0.0645
- A.14 = 0.0523
- A.15 = 0.0404
- A.16 = 0.0287
- A.17 = 0.0172
- A.18 = 0.0057
- B.36=-6.640
- C.36=2.024
- D.36=.1702
- END
- WHEN N=35 THEN DO
- A.1 = 0.4096
- A.2 = 0.2834
- A.3 = 0.2427
- A.4 = 0.2127
- A.5 = 0.1883
- A.6 = 0.1673
- A.7 = 0.1487
- A.8 = 0.1317
- A.9 = 0.1160
- A.10 = 0.1013
- A.11 = 0.0873
- A.12 = 0.0739
- A.13 = 0.0610
- A.14 = 0.0484
- A.15 = 0.0361
- A.16 = 0.0239
- A.17 = 0.0119
- B.35=-6.559
- C.35=2.012
- D.35=.1727
- END
- WHEN N=34 THEN DO
- A.1 = 0.4127
- A.2 = 0.2854
- A.3 = 0.2439
- A.4 = 0.2132
- A.5 = 0.1882
- A.6 = 0.1667
- A.7 = 0.1475
- A.8 = 0.1301
- A.9 = 0.1140
- A.10 = 0.0988
- A.11 = 0.0844
- A.12 = 0.0706
- A.13 = 0.0572
- A.14 = 0.0441
- A.15 = 0.0314
- A.16 = 0.0187
- A.17 = 0.0062
- B.34=-6.480
- C.34=2.0
- D.34=.1755
- END
- WHEN N=33 THEN DO
- A.1 = 0.4156
- A.2 = 0.2876
- A.3 = 0.2451
- A.4 = 0.2137
- A.5 = 0.1880
- A.6 = 0.1660
- A.7 = 0.1463
- A.8 = 0.1284
- A.9 = 0.1118
- A.10 = 0.0961
- A.11 = 0.0812
- A.12 = 0.0669
- A.13 = 0.0530
- A.14 = 0.0395
- A.15 = 0.0262
- A.16 = 0.0131
- B.33=-6.402
- C.33=1.988
- D.33=.1781
- END
- WHEN N=32 THEN DO
- A.1 = 0.4188
- A.2 = 0.2898
- A.3 = 0.2463
- A.4 = 0.2141
- A.5 = 0.1878
- A.6 = 0.1651
- A.7 = 0.1449
- A.8 = 0.1265
- A.9 = 0.1093
- A.10 = 0.0931
- A.11 = 0.0777
- A.12 = 0.0629
- A.13 = 0.0485
- A.14 = 0.0344
- A.15 = 0.0206
- A.16 = 0.0068
- B.32=-6.324
- C.32=1.976
- D.32=.1811
- END
- WHEN N=31 THEN DO
- A.1 = 0.4220
- A.2 = 0.2921
- A.3 = 0.2475
- A.4 = 0.2145
- A.5 = 0.1874
- A.6 = 0.1641
- A.7 = 0.1433
- A.8 = 0.1243
- A.9 = 0.1066
- A.10 = 0.0899
- A.11 = 0.0739
- A.12 = 0.0585
- A.13 = 0.0435
- A.14 = 0.0289
- A.15 = 0.0144
- B.31=-6.248
- C.31=1.965
- D.31=.1840
- END
- WHEN N=30 THEN DO
- A.1 = 0.4254
- A.2 = 0.2944
- A.3 = 0.2487
- A.4 = 0.2148
- A.5 = 0.1870
- A.6 = 0.1630
- A.7 = 0.1415
- A.8 = 0.1219
- A.9 = 0.1036
- A.10 = 0.0862
- A.11 = 0.0697
- A.12 = 0.0537
- A.13 = 0.0381
- A.14 = 0.0227
- A.15 = 0.0076
- B.30=-6.150
- C.30=1.949
- D.30=.1872
- END
- OTHERWISE NOP
- END
- IF N>19 & N<30 then
- SELECT
- WHEN N=29 THEN DO
- A.1 = 0.4291
- A.2 = 0.2968
- A.3 = 0.2499
- A.4 = 0.2150
- A.5 = 0.1864
- A.6 = 0.1616
- A.7 = 0.1395
- A.8 = 0.1192
- A.9 = 0.1002
- A.10 = 0.0822
- A.11 = 0.0650
- A.12 = 0.0483
- A.13 = 0.0320
- A.14 = 0.0159
- B.29=-6.074
- C.29=1.934
- D.29=.1907
- END
- WHEN N=28 THEN DO
- A.1 = 0.4328
- A.2 = 0.2992
- A.3 = 0.2510
- A.4 = 0.2151
- A.5 = 0.1857
- A.6 = 0.1601
- A.7 = 0.1372
- A.8 = 0.1162
- A.9 = 0.0965
- A.10 = 0.0778
- A.11 = 0.0598
- A.12 = 0.0424
- A.13 = 0.0253
- A.14 = 0.0084
- B.28=-5.988
- C.28=1.919
- D.28=.1943
- END
- WHEN N=27 THEN DO
- A.1 = 0.4366
- A.2 = 0.3018
- A.3 = 0.2522
- A.4 = 0.2152
- A.5 = 0.1848
- A.6 = 0.1584
- A.7 = 0.1346
- A.8 = 0.1128
- A.9 = 0.0923
- A.10 = 0.0728
- A.11 = 0.0540
- A.12 = 0.0358
- A.13 = 0.0178
- B.27=-5.905
- C.27=1.905
- D.27=.1980
- END
- WHEN N=26 THEN DO
- A.1 = 0.4407
- A.2 = 0.3043
- A.3 = 0.2533
- A.4 = 0.2151
- A.5 = 0.1836
- A.6 = 0.1563
- A.7 = 0.1316
- A.8 = 0.1089
- A.9 = 0.0876
- A.10 = 0.0672
- A.11 = 0.0476
- A.12 = 0.0284
- A.13 = 0.0094
- B.26=-5.803
- C.26=1.89
- D.26=.2020
- END
- WHEN N=25 THEN DO
- A.1 = 0.4450
- A.2 = 0.3069
- A.3 = 0.2543
- A.4 = 0.2148
- A.5 = 0.1822
- A.6 = 0.1539
- A.7 = 0.1283
- A.8 = 0.1046
- A.9 = 0.0823
- A.10 = 0.0610
- A.11 = 0.0403
- A.12 = 0.0200
- B.25=-5.704
- C.25=1.876
- D.25=.2063
- END
- WHEN N=24 THEN DO
- A.1 = 0.4493
- A.2 = 0.3098
- A.3 = 0.2554
- A.4 = 0.2145
- A.5 = 0.1807
- A.6 = 0.1512
- A.7 = 0.1245
- A.8 = 0.0997
- A.9 = 0.0764
- A.10 = 0.0539
- A.11 = 0.0321
- A.12 = 0.0107
- B.24=-5.605
- C.24=1.862
- D.24=.2106
- END
- WHEN N=23 THEN DO
- A.1 = 0.4542
- A.2 = 0.3126
- A.3 = 0.2563
- A.4 = 0.2139
- A.5 = 0.1787
- A.6 = 0.1480
- A.7 = 0.1201
- A.8 = 0.0941
- A.9 = 0.0696
- A.10 = 0.0459
- A.11 = 0.0228
- B.23=-5.508
- C.23=1.848
- D.23=.2157
- END
- WHEN N=22 THEN DO
- A.1 = 0.4590
- A.2 = 0.3156
- A.3 = 0.2571
- A.4 = 0.2131
- A.5 = 0.1764
- A.6 = 0.1443
- A.7 = 0.1150
- A.8 = 0.0878
- A.9 = 0.0618
- A.10 = 0.0368
- A.11 = 0.0122
- B.22=-5.413
- C.22=1.835
- D.22=.2207
- END
- WHEN N=21 THEN DO
- A.1 = 0.4643
- A.2 = 0.3185
- A.3 = 0.2578
- A.4 = 0.2119
- A.5 = 0.1736
- A.6 = 0.1399
- A.7 = 0.1092
- A.8 = 0.0804
- A.9 = 0.0530
- A.10 = 0.0263
- B.21=-5.291
- C.21=1.818
- D.21=.2264
- END
- WHEN N=20 THEN DO
- A.1 = 0.4734
- A.2 = 0.3211
- A.3 = 0.2565
- A.4 = 0.2085
- A.5 = 0.1686
- A.6 = 0.1334
- A.7 = 0.1013
- A.8 = 0.0711
- A.9 = 0.0422
- A.10 = 0.0140
- B.20=-5.153
- C.20=1.802
- D.20=.2359
- END
- OTHERWISE NOP
- END
- IF N>9 & N<20 then
- SELECT
- WHEN N=19 THEN DO
- A.1 = 0.4808
- A.2 = 0.3232
- A.3 = 0.2561
- A.4 = 0.2059
- A.5 = 0.1641
- A.6 = 0.1271
- A.7 = 0.0932
- A.8 = 0.0612
- A.9 = 0.0303
- B.19=-5.018
- C.19=1.786
- D.19=.244
- END
- WHEN N=18 THEN DO
- A.1=0.4886
- A.2=0.3253
- A.3=0.2553
- A.4=0.2027
- A.5=0.1587
- A.6=0.1197
- A.7=0.0837
- A.8=0.0496
- A.9=0.0163
- B.18=-4.885
- C.18=1.77
- D.18=.2528
- END
- WHEN N=17 THEN DO
- A.1=0.4968
- A.2=0.3273
- A.3=0.2540
- A.4=0.1988
- A.5=0.1524
- A.6=0.1109
- A.7=0.0725
- A.8=0.0359
- B.17=-4.713
- C.17=1.739
- D.17=.2622
- END
- WHEN N=16 THEN DO
- A.1=0.5056
- A.2=0.3290
- A.3=0.2521
- A.4=0.1939
- A.5=0.1447
- A.6=0.1005
- A.7=0.0593
- A.8=0.0196
- B.16=-4.567
- C.16=1.724
- D.16=.2727
- END
- WHEN N=15 THEN DO
- A.1=0.5150
- A.2=0.3306
- A.3=0.2495
- A.4=0.1878
- A.5=0.1353
- A.6=0.0880
- A.7=0.0433
- B.15=-4.373
- C.15=1.695
- D.15=.2842
- END
- WHEN N=14 THEN DO
- A.1=0.5251
- A.2=0.3318
- A.3=0.2460
- A.4=0.1802
- A.5=0.1240
- A.6=0.0727
- A.7=0.0240
- B.14=-4.155
- C.14=1.655
- D.14=.2969
- END
- WHEN N=13 THEN DO
- A.1=0.5359
- A.2=0.3325
- A.3=0.2412
- A.4=0.1707
- A.5=0.1099
- A.6=0.0539
- B.13=-3.936
- C.13=1.613
- D.13=.3111
- END
- WHEN N=12 THEN DO
- A.1=0.5475
- A.2=0.3325
- A.3=0.2347
- A.4=0.1586
- A.5=0.0922
- A.6=0.0303
- B.12=-3.731
- C.12=1.571
- D.12=.327
- END
- WHEN N=11 THEN DO
- A.1=0.5601
- A.2=0.3315
- A.3=0.2260
- A.4=0.1429
- A.5=0.0695
- B.11=-3.485
- C.11=1.515
- D.11=.3451
- END
- WHEN N=10 THEN DO
- A.1=0.5739
- A.2=0.3291
- A.3=0.2141
- A.4=0.1224
- A.5=0.0399
- B.10=-3.262
- C.10=1.471
- D.10=.36
- END
- OTHERWISE NOP
- END
- IF N>2 & N<10 then
- SELECT
- WHEN N=9 THEN DO
- A.1=0.5888
- A.2=0.3244
- A.3=0.1976
- A.4=0.0947
- B.9=-2.968
- C.9=1.4
- D.9=.39
- END
- WHEN N=8 THEN DO
- A.1=0.6052
- A.2=0.3164
- A.3=0.1743
- A.4=0.0561
- B.8=-2.696
- C.8=1.333
- D.8=.4186
- END
- WHEN N=7 THEN DO
- A.1=0.6233
- A.2=0.3031
- A.3=0.1401
- B.7=-2.356
- C.7=1.245
- D.7=.4533
- END
- WHEN N=6 THEN DO
- A.1=0.6431
- A.2=0.2806
- A.3=0.0875
- D.6=.4963
- END
- WHEN N=5 THEN DO
- A.1=0.6646
- A.2=0.2413
- D.5=.5521
- END
- WHEN N=4 THEN DO
- A.1=0.6872
- A.2=0.1677
- D.4=.6297
- END
- OTHERWISE DO
- A.1=0.7071
- D.3=.75
- END
- END
- if fo then call writech(6Info,"80 ")
- DO I=1 to K
- J=N-I+1
- SUMB=SUMB+A.I*(X.J-X.I)
- End
- Y.1=SUMB**2/S2
- DO I=1 to N
- X.I=X1.I
- End
- IF N>6 THEN G=B.N+C.N*LN((Y.1-D.N)/(1-Y.1))
- ELSE DO
- V=LN((Y.1-D.N)/(1-Y.1))
- G=SWTAB(V,N)
- END
- P=calcp(G)
- RETURN Y.1
-
- /* Shapiro-Francia W' Test of Normality for Large Samples */
- TEST2: Procedure Expose fo string X. Y.
- parse arg N
- string="Shapiro-Francia W Test of Normality for Large Samples"
- X1.=0
- Y.=0
- Z.=0
- P.=0
- SUMA=0
- SUMB=0
- SUMC=0
- SUMD=0
- DO I =1 to N
- X1.I=X.I
- End
- CALL SORTX(N)
- if fo then call writech(6Info,"20 ")
- DO I = 1 to N
- P.I=(I-.375)/(0.25+N)
- End
- if fo then call writech(6Info,"40 ")
- DO I=1 to N
- Z.I=XINORMAL(P.I)
- End
- if fo then call writech(6Info,"60 ")
- DO I=1 to N
- SUMA=SUMA+(Z.I*X.I)
- SUMB=SUMB+(Z.I**2)
- SUMC=SUMC+X.I
- SUMD=SUMD+X.I**2
- End
- if fo then call writech(6Info,"80 ")
- Y.1=(SUMA**2/SUMB)/(SUMD-SUMC**2/N)
- DO I=1 to N
- X.I=X1.I
- End
- RETURN Y.1
-
- SortX: procedure Expose fo X.
- arg NRows
- L=(xtoy(2,int(log(NRows)/log(2))))-1
- Do Until L<1
- L=trunc(int(L/2))
- Do J=1 to L
- Do K=J+L To NRows By L
- I=K
- dumdat=X.I
- Do while I>L
- y=I-L
- If X.y ~> dumdat then Leave
- X.I=X.y
- I=I-L
- End
- X.I=dumdat
- End
- End
- End
- Return
-
- /* Function xinormal */
- xinormal: Procedure
- arg p
- px=0
- pw=0
- f0=0
- p0=-0.322232431088
- p1=-1.0
- p2=-0.342242088547
- p3=-0.0204231210245
- p4=-0.0000453642210148
- q0=0.099348462606
- q1=0.588581570495
- q2=0.531103462366
- q3=0.10353775285
- q4=0.0038560700634
- pind=p
- IF (p < 1.0E-10) THEN DO
- xinormal = -10
- RETURN xinormal
- End
- IF (p >= 1.0) THEN DO
- xinormal = 10
- RETURN xinormal
- End
- IF (p = 0.5) THEN DO
- xinormal = 0.5
- RETURN xinormal
- End
- IF (p > 0.5) then p=p-1
- pw=SQRT(LOG(1/(p*p)))
- f0=(((pw*q4+q3)*pw+q2)*pw+q1)*pw+q0
- px=pw+((((pw*p4+p3)*pw+p2)*pw+p1)*pw+p0)/f0
- if (pind < 0.5) then px=-px
- xinormal = px
- RETURN xinormal
-
- cellrow: procedure
- do
- parse arg cell
- do charpos=2 to length(cell)
- if datatype(substr(cell,charpos,1),n) then return substr(cell,charpos)
- end
- return 0
- end
- Return
-
- cellcol: procedure
- do
- parse arg cell
- labels="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- cell=upper(cell)
- len=length(cell)
- val=0
- do charpos=1 to len
- if datatype(substr(cell,charpos,1),n) then
- do cell=reverse(substr(cell,1,charpos-1))
- do x=1 to length(cell)
- val=(26**(x-1))*pos(substr(cell,x,1),labels)+val
- end
- return val
- end
- end
- return 0
- end
- Return
-
- syntax:
- if arg(1)='FAIL' then do
- 'Message "Library is unavailable."'
- 'DEFPUBSCREEN("Workbench")'
- exit
- end
- 'Message "Unknown Syntax Error"'
- 'DEFPUBSCREEN("Workbench")'
- exit
-
- Format: procedure
-
- arg number, before, after
- CallLine = SIGL
- if ~datatype(CallLine, 'N') then CallLine = '??'
-
- /* Make sure we have a number as first (required) argument */
- if ~datatype(number, 'N') then do
- if number = '' then
- fc = 17 /* Wrong number of arguments */
- else
- fc = 47 /* Arithmetic conversion error */
- signal FormatSyntaxError
- end
- num = number + 0
- if before = '' & after = '' then
- return num
- else do
- parse var num integer '.' fraction
- if before = '' then before = length(integer)
- if after = '' then after = length(fraction)
- if ~datatype(before, N) | ~datatype(after, N) then
- do fc = 18
- signal FormatSyntaxError
- end
- if before < length(integer) then do
- fc = 18
- signal FormatSyntaxError
- end
- if after ~= length(fraction) then do
- fraction = trunc(('.'fraction'0') + ('.'copies('0', after)'5'), after)
- if integer<1&integer>-1 then integer=integer
- else integer = integer + (fraction % 1)
- fraction = substr(fraction, 3)
- end
- if fraction >= 0 then
- return right(integer, before)'.'fraction
- else
- return right(integer, before)
- end
-
- FormatSyntaxError:
- if show('F', STDERR) then
- call writeln(STDERR, '+++ Error' fc 'in line' CallLine':' errortext(fc))
- else
- mess='+++ Error' fc 'in line' CallLine':' errortext(fc)
- 'Message' mess
- parse source Func .
- if Func = 'FUNCTION' then do
- 'DEFPUBSCREEN("Workbench")'
- exit "Err"
- end
- else do
- 'DEFPUBSCREEN("Workbench")'
- exit 10
- end
-
- SWTAB: Procedure
- arg v n
- select
- when v<-5.4 & v>=-7 then DO
- if n=3 then G=-3.29
- else G=0
- END
- when v<-5 & v>=-5.4 then DO
- if n=3 the G=-2.81
- else G=0
- END
- when v<-4.6 & v>=-5 then DO
- if n=3 then G=-2.68
- else G=0
- END
- when v<-4.2 & v>=-4.6 then DO
- if n=3 then G=-2.54
- else G=0
- END
- when v<-3.8 & v>=-4.2 then DO
- if n=3 then G=-2.4
- else G=0
- END
- when v<-3.4 & v>=-3.8 then DO
- if n=3 then G=-2.25
- if n=4 then G=-3.5
- else G=0
- END
- when v<-3 & v>=-3.4 then DO
- if n=3 then G=-2.1
- if n=4 then G=-3.27
- else G=0
- END
- when v<-2.6 & v>=-3 then DO
- if n=3 then G=-1.94
- if n=4 then G=-3.05
- if n=5 then G=-4.01
- else G=0
- END
- when v<-2.2 & v>=-2.6 then DO
- if n=3 then G=-1.77
- if n=4 then G=-2.84
- if n=5 then G=-3.7
- else G=0
- END
- when v<-1.8 & v>=-2.2 then DO
- if n=3 then G=-1.59
- if n=4 then G=-2.64
- if n=5 then G=-3.38
- else G=0
- END
- when v<-1.4 & v>=-1.8 then DO
- if n=3 then G=-1.4
- if n=4 then G=-2.44
- if n=5 then G=-3.11
- else G=0
- END
- when v<-1 & v>=-1.4 then DO
- if n=3 then G=-1.21
- if n=4 then G=-2.22
- if n=5 then G=-2.87
- else G=0
- END
- when v<-0.6 & v>=-1.0 then DO
- if n=3 then G=-1.01
- if n=4 then G=-1.96
- if n=5 then G=-2.56
- if n=6 then G=-3.72
- else G=0
- END
- when v<-0.2 & v>=-0.6 then DO
- if n=3 then G=-0.8
- if n=4 then G=-1.66
- if n=5 then G=-2.20
- if n=6 then G=-2.88
- END
- when v<0.2 & v>=-0.2 then DO
- if n=3 then G=-0.6
- if n=4 then G=-1.31
- if n=5 then G=-1.81
- if n=6 then G=-2.27
- END
- when v<0.6 & v>=0.2 then DO
- if n=3 then G=-0.39
- if n=4 then G=-0.94
- if n=5 then G=-1.41
- if n=6 then G=-1.85
- END
- when v<1 & v>=0.6 then DO
- if n=3 then G=-0.19
- if n=4 then G=-0.57
- if n=5 then G=-0.97
- if n=6 then G=-1.38
- END
- when V<1.4 & v>=1.0 then DO
- if n=3 then G=0
- if n=4 then G=-0.19
- if n=5 then G=-0.51
- if n=6 then G=-0.84
- END
- when v<1.8 & v>=1.4 then DO
- if n=3 then G=0.18
- if n=4 then G=0.15
- if n=5 then G=-0.06
- if n=6 then G=-0.33
- END
- when v<2.2 & v>=1.8 then DO
- if n=3 then G=0.35
- if n=4 then G=0.45
- if n=5 then G=0.37
- if n=6 then G=0.18
- END
- when v<2.6 & v>=2.2 then DO
- if n=3 then G=0.52
- if n=4 then G=0.74
- if n=5 then G=0.75
- if n=6 then G=0.64
- END
- when v<3 & v>=2.6 then DO
- if n=3 then G=0.67
- if n=4 then G=1
- if n=5 then G=1.09
- if n=6 then G=1.06
- END
- when v<3.4 & v>=3 then DO
- if n=3 then G=0.81
- if n=4 then G=1.23
- if n=5 then G=1.4
- if n=6 then G=1.45
- END
- when v<3.8 & v>=3.4 then DO
- if n=3 then G=0.95
- if n=4 then G=1.44
- if n=5 then G=1.67
- if n=6 then G=1.83
- END
- when v<4.2 & v>=3.8 then DO
- if n=3 then G=1.07
- if n=4 then G=1.65
- if n=5 then G=1.91
- if n=6 then G=2.17
- END
- when v<4.6 & v>=4.2 then DO
- if n=3 then G=1.19
- if n=4 then G=1.85
- if n=5 then G=2.15
- if n=6 then G=2.5
- END
- when v<5 & v>=4.6 then DO
- if n=3 then G=1.31
- if n=4 then G=2.03
- if n=5 then G=2.47
- if n=6 then G=2.77
- END
- when v<5.4 & v>=5 then DO
- if n=3 then G=1.42
- if n=4 then G=2.19
- if n=5 then G=2.85
- if n=6 then G=3.09
- END
- when v<5.8 & v>=5.4 then DO
- if n=3 then G=1.52
- if n=4 then G=2.34
- if n=5 then G=3.24
- if n=6 then G=3.54
- END
- when v<6.2 & v>=5.8 then DO
- if n=3 then G=1.62
- if n=4 then G=2.48
- if n=5 then G=3.64
- if n=6 then G=0
- END
- when v<6.6 & v>=6.2 then DO
- if n=3 then G=1.72
- if n=4 then G=2.62
- else G=0
- END
- when v<7 & v>=6.6 then DO
- if n=3 then G=1.81
- if n=4 then G=2.75
- else G=0
- END
- when v<7.4 & v>=7 then DO
- if n=3 then G=1.9
- if n=4 then G=2.87
- else G=0
- END
- when v<7.8 & v>=7.4 then DO
- if n=3 then G=1.98
- if n=4 then G=2.97
- else G=0
- END
- when v<8.2 & v>=7.8 then DO
- if n=3 then G=2.07
- if n=4 then G=3.08
- else G=0
- END
- when v<8.6 & v>=8.2 then DO
- if n=3 then G=2.15
- if n=4 then G=3.22
- else G=0
- END
- when v<9 & v>=8.6 then DO
- if n=3 then G=2.23
- if n=4 then G=3.36
- else G=0
- END
- when v<9.4 & v>=9 then DO
- if n=3 then G=2.31
- else G=0
- END
- when v<9.8 & v>=9.4 then DO
- if n=3 then G=2.38
- else G=0
- END
- when v>=9.8 then DO
- if n=3 then G=2.45
- else G=0
- END
- OTHERWISE nop
- END
- RETURN G
-
- calcp: Procedure
- arg g
- factk=1
- pp=0
- itts=0
- term=1
- k=0
- do while abs(term)>(exp(-23))
- term=.3989422804*((-1)**k)*(g**k)/(2*k+1)/(2**k)*(g**(k+1))/factk
- pp=pp+term
- k=k+1
- factk=factk*k
- end
- pp=pp+.5
- if (pp<.0000000001) then pp=0
- return pp
-